import json


from django.views import View
from django.http.response import JsonResponse
from rest_framework.viewsets import ModelViewSet

from books.serializers import BookInfo1Serializer,BookInfo2Serializer,BookInfoModelSerializer
from books.models import BookInfo

class BookInfoViewSet(View):


    """  使用django的View  """
    """序列化器，单个"""
    def get1(self, request):
        # 1. 获取数据源
        instance = BookInfo.objects.first()
        # 2. 获取序列化对象
        serializer = BookInfo2Serializer(instance=instance)
        # 3. 调用序列化器的data属性，获取转换之后的数据
        data = serializer.data
        # 4. 响应数据
        return JsonResponse(data,status=200)

    """序列化器，多个"""
    def get(self,request):
        """序列化器，多个"""
        # 1. 获取数据源
        instance = BookInfo.objects.all()
        # 1，获取序列化器实列化对象
        serializer = BookInfo1Serializer(instance=instance,many=True)  #many 设置能有多条数据,会在内部调用一个循环进行遍历 QuerySet对象 获取 id
        # 3.调用序列化器对象的data属性方法获取转换后的数据
        data = serializer.data
        # 4.响应数据
        return JsonResponse(data,status=200,safe=False)  # safe 设置 对非字典对象装换成字典对象

    # 反序列化
    def get3(self,request):
        # 1. 接受用户的数据
        # data = json.dumps(request.body)
        # 模拟来自客户的数据
        data = {
            "title":"django",
            "reader":"320",
        }
        # 1.1 调用序列化进行数据验证
        serializer = BookInfo2Serializer(data = data)
        # 1.2 调用序列化器进行数据验证
        ret = serializer.is_valid() # 不抛出异常
        # 1.3 获取验证以后的结果
        if ret :
            return JsonResponse(dict(serializer.validated_data))
        else:
            return JsonResponse(dict(serializer.errors))
        # 2. 操作数据库

    # 抛出异常
    def get4(self,request):
        # 1. 接受用户的数据
        # data = json.dumps(request.body)
        # 模拟来自客户的数据
        data = {
            "title":"长江七号",
            "reader":"110",
        }
        # 1.1 调用序列化进行数据验证
        serializer = BookInfo2Serializer(data = data)
        # 1.2 调用序列化器进行数据验证
        ret = serializer.is_valid(raise_exception=True) # 抛出异常
        # 1.3 获取验证以后的结果
        return JsonResponse(dict(serializer.validated_data))
        # 2. 操作数据库

    # 反序列化  添加数据
    def get5(self,request):
        # 1. 接受用户的数据
        # data = json.dumps(request.body)
        # 模拟来自客户的数据
        data = {
            "title":"长江七号2",
            "reader":"110",
        }
        # 1.1 调用序列化进行数据验证
        serializer = BookInfo2Serializer(data=data)
        # 1.2 调用序列化器进行数据验证
        ret = serializer.is_valid(raise_exception=True) # 抛出异常

        # 2 获取验证以后的结果,操作数据库
        serializer.save()

        return JsonResponse(serializer.data,status=201)

    # 反序列化  更新数据
    def get6(self,request):
        # 1. 根据客户端访问的url地址中，获取pk值
        # books/home/2  path("/home/(?P<id>)\d+/",views.BookInfoViewSet.as_view()),
        id = 6
        try:
            book = BookInfo.objects.get(id=id)
        except Exception as e:
            return JsonResponse({"errors":"该学生不存在"},status=404)
        # 2. 模拟来自客户的数据
        data = {
            "title":"长江七号5",
            "reader":"1000",
        }

        # 3. 修改操作中的实例化序列器对象
        serializer = BookInfo2Serializer(instance=book,data=data)

        # 4. 数据验证
        serializer.is_valid(raise_exception=True)

        # 5. 入库
        serializer.save()

        # 6. 数据返回
        return JsonResponse(serializer.data)


# 模型化序列化器
class BookInfoViewSet1(View):


    """  使用django的View  """
    """序列化器，单个"""
    def get1(self, request):
        # 1. 获取数据源
        instance = BookInfo.objects.first()
        # 2. 获取序列化对象
        serializer = BookInfoModelSerializer(instance=instance)
        # 3. 调用序列化器的data属性，获取转换之后的数据
        data = serializer.data
        # 4. 响应数据
        return JsonResponse(data,status=200)

    """序列化器，多个"""
    def get2(self,request):
        """序列化器，多个"""
        # 1. 获取数据源
        instance = BookInfo.objects.all()
        # 1，获取序列化器实列化对象
        serializer = BookInfoModelSerializer(instance,many=True)  #many 设置能有多条数据,会在内部调用一个循环进行遍历 QuerySet对象 获取 id
        # 3.调用序列化器对象的data属性方法获取转换后的数据
        data = serializer.data
        # 4.响应数据
        return JsonResponse(data,status=200,safe=False,json_dumps_params={'ensure_ascii':False})  # safe 设置 对非字典对象装换成字典对象

    # 反序列化
    def get3(self,request):
        # 1. 接受用户的数据
        # data = json.dumps(request.body)
        # 模拟来自客户的数据
        data = {
            "title":"django",
            "reader":"",
        }
        # 1.1 调用序列化进行数据验证
        serializer = BookInfoModelSerializer(data = data)
        # 1.2 调用序列化器进行数据验证
        ret = serializer.is_valid() # 不抛出异常
        # 1.3 获取验证以后的结果
        if ret:
            return JsonResponse(dict(serializer.validated_data),json_dumps_params={'ensure_ascii':False})
        else:
            return JsonResponse(dict(serializer.errors),json_dumps_params={'ensure_ascii':False})
        # 2. 操作数据库

    # 抛出异常
    def get4(self,request):
        # 1. 接受用户的数据
        # data = json.dumps(request.body)
        # 模拟来自客户的数据
        data = {
            "title":"长江七号",
            "reader":"",
        }
        # 1.1 调用序列化进行数据验证
        serializer = BookInfoModelSerializer(data = data)
        # 1.2 调用序列化器进行数据验证
        ret = serializer.is_valid(raise_exception=True) # 抛出异常
        # 1.3 获取验证以后的结果
        return JsonResponse(dict(serializer.validated_data))
        # 2. 操作数据库

    # 反序列化  添加数据
    def get5(self,request):
        # 1. 接受用户的数据
        # data = json.dumps(request.body)
        # 模拟来自客户的数据
        data = {
            "title":"长江七号2",
            "reader":"110",
        }
        # 1.1 调用序列化进行数据验证
        serializer = BookInfoModelSerializer(data=data)
        # 1.2 调用序列化器进行数据验证
        ret = serializer.is_valid(raise_exception=True) # 抛出异常

        # 2 获取验证以后的结果,操作数据库
        serializer.save()

        return JsonResponse(serializer.data,status=201)

    # 反序列化  更新数据
    def get6(self,request):
        # 1. 根据客户端访问的url地址中，获取pk值
        # books/home/2  path("/home/(?P<id>)\d+/",views.BookInfoViewSet.as_view()),
        id = 6
        try:
            book = BookInfo.objects.get(id=id)
        except Exception as e:
            return JsonResponse({"errors":"该学生不存在"},status=404)
        # 2. 模拟来自客户的数据
        data = {
            "title":"长江七号71",
            "reader":"1000",
        }

        # 3. 修改操作中的实例化序列器对象
        serializer = BookInfoModelSerializer(instance=book,data=data)

        # 4. 数据验证
        serializer.is_valid(raise_exception=True)

        # 5. 入库
        serializer.save()

        # 6. 数据返回
        return JsonResponse(serializer.data)


